/*
 * @Author: 徐建辰
 * @Date: 2022-05-23 14:02:35
 * @LastEditTime: 2022-06-10 11:55:04
 * @LastEditors: xjc
 * @Description: 防抖函数
 */
import {isFunc} from '@/utils/type'
let timeout = null

/**
 * 防抖原理：一定时间内，只有最后一次操作，再过delay毫秒后才执行函数
 *
 * @param {Function} fu 要执行的回调函数，必传
 * @param {Number} delay 延时的时间
 * @param {Boolean} immediate 是否立即执行
 */
export default function debounce(fn, delay = 500, immediate = false) {
  if (!isFunc(fn)) {
    throw new Error(`debounce function first argument must be a function, not ${typeof fn}`);
  }
  // 清除定时器
  if (timeout !== null) clearTimeout(timeout)
  if (immediate) {
    const callNow = !timeout
    timeout = setTimeout(() => {
      timeout = null
    }, delay)
    if (callNow) isFunc(fn) && fn()
  } else {
    // 设置定时器，当最后一次操作后，timeout不会再被清除，所以在延时delay毫秒后执行fu回调方法
    timeout = setTimeout(() => {
      isFunc(fn) && fn()
    }, delay)
  }
}

export function _debounce(fn, time) {
  let timeout = null
  return function() {
    clearTimeout(timeout)
    timeout = setTimeout(() => {
      fn.call(this, arguments)
    }, time)
  }
}